#ifndef _LINUX_ALSA_SOUND_HEAD_H
#define _LINUX_ALSA_SOUND_HEAD_H
#include <iostream>
#include <alsa/asoundlib.h>
#include <vector>

using namespace std;

typedef struct
{
    // access - 交错模式:SND_PCM_ACCESS_RW_INTERLEAVED
    // 非交错模式:SND_PCM_ACCESS_RW_NONINTERLEAVED
    snd_pcm_access_t access; // 交错方式

    // format -
    //      8位格式         - SND_PCM_FORMAT_S8
    //      有符号16位小端   - SND_PCM_FORMAT_S16_LE
    //      有符号16位大端   - SND_PCM_FORMAT_S16_BE
    //      无符号16位小端   - SND_PCM_FORMAT_U16_LE
    snd_pcm_format_t format; // 数据格式

    // val
    // 2  - 双通道(stereo)
    // 1  - 单通道(mono)
    int channels;

    // approximate target rate / returned approximate set rate
    // 44100 or 48000 or 8000
    // 采样率
    // 也叫采样频率，是指每秒钟采样次数，该次数是针对帧而言。譬如常见的采样率有：
    // 8KHz - 电话所用采样率
    // 22.05KHz - FM 调频广播所用采样率
    // 44.1KHz - 音频 CD，也常用于 MPEG-1 音频（VCD、SVCD、MP3）所用采样率
    // 48KHz - miniDV、数字电视、DVD、DAT、电影和专业音频所用的数字声音所用采样率。
    uint32_t sampleRate;

    // 采样位数
    // 者说每个采样样本所包含的位数（计算机对每个通道采样量化时数字比特位数），通常有 8bit、16bit、24bit 等。
    uint32_t sampleBits;

    // 一个周期多少祯
    snd_pcm_uframes_t frames;

} pcm_hw_param_t;

class LinuxAlsaSound
{
public:
    LinuxAlsaSound();
    bool open(const string &pcmDevice, snd_pcm_stream_t stream);
    bool setParams(pcm_hw_param_t *pcmParm);
    // 录制声音 微秒 pcmData音频存储的vector
    bool record(uint32_t mtime, vector<uint8_t> &pcmData);
    // 录制的声音存储到文件中去
    bool recordPCMData(uint32_t time, const string &filename);
    //文件转成Wav格式
    bool recoredWAVData(uint32_t time, const string &filename);
    void pause(void);
    void resume(void);

private:
    snd_pcm_t *pcmHandle;
    snd_pcm_hw_params_t *pcmParams;
    uint16_t channels;
    uint32_t sampleBits; // 采样的位数
};

#endif